#include "tim.h"
#include "canfestival.h"

/* USER CODE BEGIN 0 */
TIM_HandleTypeDef htim3;
/* USER CODE END 0 */


/* TIM3 init function */
void TIM3_Init(void)
{

  /* USER CODE BEGIN TIM3_Init 0 */

  /* USER CODE END TIM3_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  /* USER CODE BEGIN TIM3_Init 1 */

  /* USER CODE END TIM3_Init 1 */
  htim3.Instance = CANOPEN_TIMx;
  htim3.Init.Prescaler = CANOPEN_TIM_PRESCALER_VALUE;  //计数频率
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = CANOPEN_TIM_PERIOD;  //溢出时间为50ms
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM3_Init 2 */
  if(HAL_TIM_Base_Start_IT(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE END TIM3_Init 2 */

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM3)
  {
  /* USER CODE BEGIN TIM3_MspInit 0 */

  /* USER CODE END TIM3_MspInit 0 */
    /* TIM3 clock enable */
    __HAL_RCC_TIM3_CLK_ENABLE();

    /* TIM3 interrupt Init */
    
    HAL_NVIC_SetPriority(CANOPEN_TIM_IRQn, CANOPEN_TIM_Priority, 0);
    HAL_NVIC_EnableIRQ(CANOPEN_TIM_IRQn);
  /* USER CODE BEGIN TIM3_MspInit 1 */

  /* USER CODE END TIM3_MspInit 1 */
  }
}

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM3)
  {
  /* USER CODE BEGIN TIM3_MspDeInit 0 */

  /* USER CODE END TIM3_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_TIM3_CLK_DISABLE();

    /* TIM3 interrupt Deinit */
    HAL_NVIC_DisableIRQ(TIM3_IRQn);
  /* USER CODE BEGIN TIM3_MspDeInit 1 */

  /* USER CODE END TIM3_MspDeInit 1 */
  }
}

/* USER CODE BEGIN 1 */
#define HAL_CANOPEN_TIMx htim3
/* 该文件用于实现CANFestival的用户接口部分 */


/************************************************
函数名称 ： setTimer
功    能 ： Set the timer for the next alarm.
            （设置一个value ms后触发的软中断定时器）
参    数 ： value --- 参数
返 回 值 ： 无
作    者 ： strongerHuang
*************************************************/
/* 定时器TIM相关变量 */
void setTimer(TIMEVAL value)
{
  __HAL_TIM_SetAutoreload(&HAL_CANOPEN_TIMx, value);
}

/************************************************
函数名称 ： getElapsedTime
功    能 ： Return the elapsed time to tell the Stack how much time is spent since last call.
            （返回数据，自从上次调用该函数到现在间隔多久）
参    数 ： 无
返 回 值 ： (消逝的)时间
作    者 ： strongerHuang
*************************************************/
TIMEVAL getElapsedTime(void)
{
  return __HAL_TIM_GetCounter(&HAL_CANOPEN_TIMx);
}




/************************************************
函数名称 ： TIMx_DispatchFromISR
功    能 ： 定时调度(从定时器中断)
参    数 ： 无
返 回 值 ： 无
作    者 ： strongerHuang
*************************************************/
void TIMx_DispatchFromISR(void)
{
    TimeDispatch();
}


/* USER CODE END 1 */
